昨天的 Day 4 終於正式建立了 Spring Boot 專案,也成功讓專案跑起來。
但是目前的智慧健康助理其實還什麼都不會做 XD
所以今天要完成第一個真正可以操作的功能:
建立第一個 REST API,讓 Spring Boot 可以接收請求並回傳文字!
今天先不急著做 BMI,也先不碰 AI。
我們先從最經典的:
Hello World!
開始!
Day 3 有稍微提到 API,可以把它簡單理解成:
讓不同程式之間互相溝通的方法。
而今天要做的是 REST API。
以我們的 Spring Boot 專案來說,可以先把流程想成:
使用者
↓
發送 HTTP Request
↓
Spring Boot
↓
Controller
↓
Java 處理
↓
回傳 Response
↓
使用者看到結果
例如等等建立:
/hello
當使用者進入這個網址時,Spring Boot 收到請求後,就會找到負責 /hello 的 Java 程式,最後回傳:
Hello! I'm your health assistant!
這就是今天要完成的第一個 REST API。
要讓 Spring Boot 知道:
「有人進入
/hello的時候,要執行哪一段 Java 程式?」
就需要建立 Controller。
Controller 可以想成使用者與程式之間的其中一個入口。
使用者送出 Request 之後,Controller 會負責接收請求,再決定要執行什麼程式。
所以今天先在 Java 專案中建立一個新的 Class:
HelloController.java
目前的專案結構大概會變成:
health-assistant
│
├── src
│ └── main
│ ├── java
│ │ └── ...
│ │ ├── HealthAssistantApplication.java
│ │ └── HelloController.java
│ │
│ └── resources
│ └── application.properties
│
└── pom.xml
接下來開始寫今天第一段程式:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello! I'm your health assistant!";
}
}
看起來只有幾行,但是裡面出現了一些以前寫普通 Java 程式時比較少看到的東西。
所以接下來一個一個看。
首先是:
@RestController
這是一個 Annotation(註解)。
它可以告訴 Spring Boot:
「這個 Class 是用來處理 Web Request 的 Controller。」
所以當 Spring Boot 啟動時,就會知道 HelloController 是其中一個負責接收 Request 的地方。
如果沒有加上 @RestController,Spring Boot 就不會把這個 Class 當成 REST Controller 使用。
下一個重要的地方是:
@GetMapping("/hello")
@GetMapping 用來處理 HTTP GET Request。
而括號裡面的:
/hello
就是我們設定的路徑。
也就是說,當使用者發送:
GET /hello
Spring Boot 就會找到下面這個 Method:
public String hello() {
return "Hello! I'm your health assistant!";
}
然後執行它。
現在可以把整個流程重新整理一次。
當我在瀏覽器輸入:
http://localhost:8080/hello
首先瀏覽器會向 Spring Boot 發出 Request。
接著:
瀏覽器
↓
GET /hello
↓
Spring Boot
↓
HelloController
↓
@GetMapping("/hello")
↓
hello()
↓
return "Hello! I'm your health assistant!"
↓
瀏覽器顯示結果
最後應該會看到:
Hello! I'm your health assistant!
🎉 第一個 REST API 完成!
剛剛輸入的網址是:
http://localhost:8080/hello
可以把它拆成幾個部分:
http://localhost:8080/hello
└───────┘ └──┘ └────┘
主機 Port Path
localhost 代表目前正在使用的這台電腦。
也就是說,現在這個 Spring Boot 專案還不是放在真正的網路伺服器上,而是在自己的電腦執行。
Spring Boot 預設使用的 Port 是:
8080
所以當 Spring Boot 成功啟動之後,可以透過:
localhost:8080
找到正在本機執行的 Spring Boot Application。
最後的:
/hello
就是剛才透過 @GetMapping 設定的路徑。
既然 /hello 已經成功了,我想再稍微往這次的主題靠近一點。
所以再新增一個:
@GetMapping("/health")
public String health() {
return "Welcome to your smart health assistant!";
}
完整的 Controller 就會變成:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello! I'm your health assistant!";
}
@GetMapping("/health")
public String health() {
return "Welcome to your smart health assistant!";
}
}
重新啟動程式後,在瀏覽器輸入:
http://localhost:8080/health
就應該會看到:
Welcome to your smart health assistant!
雖然目前還只會回傳固定文字,但至少我們的健康助理終於第一次「開口說話」了!
今天第一次真正接觸 Spring Boot 的 REST API,也認識了幾個很重要的概念。
負責接收使用者送進來的 Request。
告訴 Spring Boot:
這個 Class 是一個 REST Controller。
設定某個網址路徑要由哪一個 Method 處理。
例如:
@GetMapping("/hello")
代表收到:
GET /hello
時,就執行對應的 Method。
目前可以先簡單記成:
使用者輸入網址
↓
@GetMapping 找到對應路徑
↓
Controller 執行 Method
↓
return 結果
↓
使用者看到結果
目前我們已經可以做到:
/hello
/health
但是現在還有一個很明顯的問題。
我們回傳的內容全部都是:
return "固定的文字";
不管使用者是誰,輸入什麼東西,結果都完全一樣。
真正的智慧健康助理當然不能只有這樣。
接下來就需要讓使用者可以:
把資料傳進 Java,再讓 Java 根據資料產生不同的結果。
這樣我們才有辦法慢慢做到 BMI、健康紀錄,甚至後面的 AI 功能。
今天終於完成了這個專案的第一個 REST API!
從昨天只有一個空空的 Spring Boot 專案,到今天已經可以透過瀏覽器向 Java 發送 Request,並收到 Response。
今天最大的收穫就是理解:
Spring Boot 可以透過 Controller 接收 Request,再由 Java 處理並回傳 Response。
現在我們的智慧健康助理雖然只會說:
Hello! I'm your health assistant!
但至少它終於會說話了
下一步,就是讓它不要只會回答固定的內容!